import js from '@eslint/js'
import globals from 'globals'
import tseslint from 'typescript-eslint'
import vue from 'eslint-plugin-vue'
import prettier from 'eslint-config-prettier'

export default [
  js.configs.recommended,
  ...tseslint.configs.recommended,
  ...vue.configs['flat/essential'],
  {
    files: ['**/*.vue'],
    languageOptions: {
      globals: {
        ...globals.browser
      },
      parser: vue.parser,
      parserOptions: {
        parser: tseslint.parser,
        ecmaVersion: 'latest',
        sourceType: 'module'
      }
    }
  },
  {
    // 基本JavaScript/TypeScript规则
    rules: {
      // 1. 变量相关规则
      'no-var': 'error', // 禁止使用var
      'prefer-const': 'error', // 如果变量不会被重新赋值，使用const
      'no-const-assign': 'error', // 禁止修改const声明的变量
      '@typescript-eslint/no-unused-vars': [
        'error',
        {
          argsIgnorePattern: '^_', // 忽略以_开头的参数
          varsIgnorePattern: '^_'
        }
      ],

      // 2. 函数相关规则
      'arrow-body-style': ['error', 'as-needed'], // 箭头函数体风格
      'arrow-parens': ['error', 'as-needed'], // 箭头函数参数括号
      'no-empty-function': 'warn', // 禁止空函数
      'no-return-await': 'error', // 禁止return await

      // 3. 代码风格规则
      curly: ['error', 'multi-line'], // 控制语句花括号规则
      'brace-style': ['error', '1tbs'], // 大括号风格
      semi: ['error', 'never'], // 是否使用分号
      quotes: ['error', 'single'], // 引号风格
      'quote-props': ['error', 'as-needed'], // 对象属性引号

      // 4. TypeScript特定规则
      '@typescript-eslint/explicit-function-return-type': 'off', // 函数返回类型
      '@typescript-eslint/no-explicit-any': 'warn', // 禁止使用any类型
      '@typescript-eslint/type-annotation-spacing': 'error', // 类型注解空格
      '@typescript-eslint/consistent-type-imports': 'error', // 一致的类型导入
      '@typescript-eslint/no-non-null-assertion': 'warn', // 禁止使用非空断言

      // 5. 控制台和调试
      'no-console': ['warn', { allow: ['warn', 'error'] }], // 禁止console
      'no-debugger': 'warn', // 禁止debugger

      // 6. Vue特定规则
      'vue/multi-word-component-names': 'off', // 组件名称多单词
      'vue/html-self-closing': [
        'error',
        {
          // 自闭合标签风格
          html: {
            void: 'always',
            normal: 'never',
            component: 'always'
          }
        }
      ],
      'vue/max-attributes-per-line': [
        'error',
        {
          // 每行最大属性数
          singleline: 3,
          multiline: 1
        }
      ],
      'vue/attribute-hyphenation': ['error', 'always'], // 属性连字符命名
      'vue/no-v-html': 'warn', // 禁止v-html (XSS风险)
      'vue/no-template-shadow': 'error', // 禁止模板中的变量遮蔽
      'vue/component-name-in-template-casing': ['error', 'PascalCase'], // 组件名大小写
      'vue/require-default-prop': 'error', // 要求prop设置默认值
      'vue/return-in-computed-property': 'error', // 计算属性必须有返回值
      'vue/no-mutating-props': 'error', // 禁止修改props
      'vue/valid-v-for': 'error', // v-for验证

      // 7. 最佳实践规则
      'no-duplicate-imports': 'error', // 禁止重复导入
      'no-useless-constructor': 'error', // 禁止不必要的构造函数
      'prefer-template': 'error', // 使用模板字符串
      'prefer-destructuring': [
        'error',
        {
          // 优先使用解构赋值
          array: true,
          object: true
        }
      ]
    }
  },
  prettier
]
